package br.org.desa.agendaescolar.bean;

import java.io.Serializable;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;


import br.org.desa.agendaescolar.controlador.CompromissoControle;
import br.org.desa.agendaescolar.controlador.UsuarioControle;
import br.org.desa.agendaescolar.modelo.*;

@ManagedBean(name="Sessao")
@SessionScoped
public class SessaoBean implements Serializable{

        private Usuario usuario = new Usuario();
        private String login;
        private String senha;
        private String senhaAntiga;
        private String confirmaSenha;
        private UsuarioControle usuarioControle = new UsuarioControle();
        private Date dataAniversarioAluno = new Date();
        private CompromissoControle compromissoControle = new CompromissoControle();
        
        	public SessaoBean(){
        		//this.cargaInicial();
        	}
        
        private void cargaInicial(){
        	try{
	        	Usuario vlader = usuarioControle.buscaUsuarioPorLogin("vlader");
	        	if (vlader == null){
	        		vlader = new Usuario();
	        		vlader.setLogin("vlader");
	        		vlader.setNome("Vlader Nobre");
	        		vlader.setSenha("123");
	        		vlader.setTipoUsuario(TipoUsuario.PROFESSOR);
	        		usuarioControle.cadastraUsuario(vlader);
	        	}
        	}catch(Exception e){
        		System.out.println("Erro ao cadastrar vlader");
        	}
        	
        	compromissoControle.desativaCompromissosPassados();
        }
        	
        public Usuario getUsuario() {
                return usuario;
        }
        
        public void setUsuario(Usuario usuario) {
                this.usuario = usuario;
        }

        public String getLogin() {
                return login;
        }

        public void setLogin(String login) {
                this.login = login;
        }

        public String getSenha() {
                return senha;
        }

        public void setSenha(String senha) {
                this.senha = senha;
        }
        
        public String getSenhaAntiga() {
			return senhaAntiga;
		}

		public void setSenhaAntiga(String senhaAntiga) {
			this.senhaAntiga = senhaAntiga;
		}
		
		public String getConfirmaSenha() {
			return confirmaSenha;
		}

		public void setConfirmaSenha(String confirmaSenha) {
			this.confirmaSenha = confirmaSenha;
		}

		public Date getDataAniversarioAluno() {
			return dataAniversarioAluno;
		}

		public void setDataAniversarioAluno(Date dataAniversarioAluno) {
			this.dataAniversarioAluno = dataAniversarioAluno;
		}

		//Metodos Gerais
        public String autenticaUsuario(){
        	FacesContext contexto = FacesContext.getCurrentInstance();
        	usuario = this.usuarioControle.buscaUsuarioPorLogin(this.login);
            if(usuario != null){
            	if(usuario.getSenha().equals(this.senha)){
	               this.limpaDados();
	               if(usuario.getTipoUsuario().equals(TipoUsuario.PROFESSOR)){
	            	   return "PrincipalProfessor";
	               }else{
	            	   return "PrincipalAluno";
	               }
            	}else{
            		this.limpaDados();
                    contexto.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Usuário ou senha inválido! ", "Tente novamente."));
                    return "Login";
            	}
            }else{
                this.limpaDados();
                contexto.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Usuário ou senha inválido! ", "Tente novamente."));
                return "Login"; 
            }
        }
        
        //desconecta do sistema - mata sessao
        public String desconectar(){
            HttpSession sessao =  (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
            if (sessao != null){
                    sessao.invalidate();
                    System.out.println("usuario desconectado");
                    this.usuario = new Usuario();
            }
            return "Login";
        }
        
        public void limpaDados(){
        	this.login = null;
            this.senha = null;
        }
        
        public String alterarDadosUsuario(){
        	FacesContext contexto = FacesContext.getCurrentInstance();
        	try{
        		GregorianCalendar cal = new GregorianCalendar();
        		cal.setTime(this.dataAniversarioAluno);
        		this.usuario.setDataAniversario(cal);
        		usuarioControle.alterarUsuario(this.usuario);
        		contexto.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Dados do Usuário alterados com sucesso!", ""));
        		if(this.usuario.getTipoUsuario().equals(TipoUsuario.PROFESSOR)){
        			return "PrincipalProfessor";
        		}else{
        			return "PrincipalAluno";
        		}
        	}catch(Exception e){
        		contexto.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Falha ao atualizar dados do usuário", ""));
        		return null;
        	}
        }
        
        public String alterarSenha(){
        	FacesContext contexto = FacesContext.getCurrentInstance();
        	if(this.senhaAntiga.equals(this.usuario.getSenha())){
        		if(this.senha.equals(this.confirmaSenha)){
		        	try{
		        		usuarioControle.alterarUsuario(this.usuario);
		        		contexto.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Senha alterada com sucesso", ""));
		        		if(this.usuario.getTipoUsuario().equals(TipoUsuario.PROFESSOR)){
		        			return "PrincipalProfessor";
		        		}else{
		        			return "PrincipalAluno";
		        		}
		        	}catch(Exception e){
		        		contexto.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Falha ao alterar senha, tente novamente", ""));
		        		return null;
		        	}
        		}else{
        			contexto.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Senhas novas não são iguais, tente novamente", ""));
	        		return null;
        		}
        	}else{
        		contexto.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Senha antiga não confere, digite novamente", ""));
        		return null;
        	}
        }
        
        //Supostamente esse metodo corrige o bug da hora
        public TimeZone getTimeZone()
        {
            return TimeZone.getDefault();
        }
}
